//公式组件类型
var _formulaType_varchar = "formulaType_varchar";//字符串类型公式(动态组合)
var _formulaType_number = "formulaType_number";//数字类型公式
var _formulaType_date = "formulaType_date";//日期类型公式
var _formulaType_datetime = "formulaType_datetime";//日期时间类型公式
//条件组件类型
var _conditionType_BizCheck = "conditionType_BizCheck";//业务规则校验
var _conditionType_hign_auth = "conditionType_hign_auth";//高级设置条件
var _conditionType_noFunction = "conditionType_noFunction";//不需要函数
var _conditionType_all = "conditionType_all";//所有界面元素

String.prototype.replaceAll = function(s1,s2) {
	return this.replace(new RegExp(s1,"gm"),s2);
};

/**
 * 根据字段信息判断当前字段是否为主表字段
 * @param fieldInfo
 */
function isMasterField(fieldInfo){
	var ownerTableName = fieldInfo.ownerTableName;
	if(ownerTableName.indexOf("formmain") > -1){
		return true;
	}else{
		return false;
	}
}

/**
 * 根据字段类型，返回公式类型
 * @param fieldType 字段类型
 * @since V7.0
 */
function  getFormulaTypeByFieldType(fieldType){
	var formulaType = "";
	switch(fieldType){
		case "VARCHAR" : {
			formulaType = _formulaType_varchar;
			break;
		}
		case "DECIMAL" : {
			formulaType = _formulaType_number;
			break;
		}
		case "TIMESTAMP" : {
			formulaType = _formulaType_date;
			break;
		}
		case "DATETIME" : {
			formulaType = _formulaType_datetime;
			break;
		}
	}
	return formulaType;
}

/**
 * 普通校验规则设置
 * @param data 设计器中的表单信息
 * @param callback 设计器回调函数
 * @since V7.0
 */
function setCheckRule(data, callback){
	var formulaArgs = getConditionArgs(function (formulaStr,callBackCalledFunc){
		var rulInfo = {"data":[{"keyword":"if","condition":"","result":formulaStr,"sort":0}],"advanceCheckRule":"0"};
		if(formulaStr){
			var jsonSuccess = '{"success":true,"result":'+ $.toJSON(rulInfo) +'}';
			callBackCalledFunc && callBackCalledFunc(jsonSuccess);
		}else{
			callBackCalledFunc && callBackCalledFunc('{"success":true,"result":""}');
		}
	}, data.id, _conditionType_BizCheck, "", "", null);
	//回填的校验规则
	formulaArgs.formulaStr = (data.checkRuleData == null || data.checkRuleData == "") ? "" : data.checkRuleData.data[0].result;
	formulaArgs.title = $.i18n('form.baseinfo.checkRule.set.label');//校验规则设置
	formulaArgs.allowSubFieldAloneUse = true;
	formulaArgs.checkSubFieldMethod = true;//验证重复项字段必须出现在重复项方法中。
	formulaArgs.parentWin = window;
	formulaArgs.data = data;
	formulaArgs.callBackCalledFunc = callback;
	showFormula(formulaArgs);
}

//设置计算式高级的条件(重构)
function setFieldHighCondition(obj, formId, fieldInfo){
	var formulaArgs = getConditionArgs(function (formulaStr){
		$(obj).val(formulaStr);
	},formId,_conditionType_hign_auth,$.trim($(obj).val()),null,null);
	formulaArgs.hasDifferSubField = true;
	// 计算条件设置
	formulaArgs.title = $.i18n('form.baseinfo.formula.condtion.set.label');
	formulaArgs.parentWin = window;
	formulaArgs.filterFields =  fieldInfo.name;
	formulaArgs.allowSubFieldAloneUse = true;
	formulaArgs.checkSubFieldMethod = isMasterField(fieldInfo);
	formulaArgs.allowSubMethod = isMasterField(fieldInfo);
	formulaArgs.fieldTableName = fieldInfo.ownerTableName;
	showFormula(formulaArgs);
}

//设置高级中计算式(重构)
function setFieldHighFormula(obj, formId, fieldInfo){
	var formulaArgs = getFormulaArgs(function (formulaStr){
	    $(obj).val(formulaStr);
	},formId,getFormulaTypeByFieldType(fieldType),$(obj).val(),null);
	formulaArgs.parentWin = window;
	formulaArgs.filterFields =  fieldInfo.name;
	formulaArgs.allowSubFieldAloneUse = !isMasterField(fieldInfo);
	formulaArgs.fieldTableName = fieldInfo.ownerTableName;
	formulaArgs.selectedFieldName = fieldInfo.name;
	formulaArgs.fieldType = fieldType;
	formulaArgs.selectedFieldDisplay = "{"+fieldInfo.display+"}";
	formulaArgs.isAdvanced = true;
	formulaArgs.isMaster4Advanced = isMasterField(fieldInfo);
	formulaArgs.checkSubFieldMethod = isMasterField(fieldInfo);
	showFormula(formulaArgs);
}

/**
 * 表单设计器设置普通计算式
 * @param fieldType 字段类型
 * @param advanceUrl 高级公式url
 * @param data 表单数据json
 * @param callback 表单设计器回调函数
 * @param fieldInfo 字段信息
 * @param changetype
 * @return {jQuery|*}
 */
function setOrdinaryFieldFormula(fieldType, advanceUrl, data, callback, fieldInfo, changetype){
	var formulaArgs = getFormulaArgs(function (formulaStr, callback){
		//设置计算公式规则点击OK后的回调方法,将公式字符串设置给json对象
		var advanceCheckRule = "0";
		var rulInfo = {"data":[{"keyword":"if","condition":"","result":formulaStr,"sort":0}],"advanceCheckRule":advanceCheckRule};
		if(formulaStr){
			callback && callback($.toJSON(rulInfo));
		}else{
			callback && callback("");
		}

	},data.formBaseInfo.formInfo.id,getFormulaTypeByFieldType(fieldType),"",null);
    //获取需要回填的公式
    var forumlaJsonStr = fieldInfo.formulaInfo;
    var formulaJsonObj = forumlaJsonStr == "" ? "" : $.parseJSON(forumlaJsonStr);
    formulaArgs.formulaStr = (formulaJsonObj == "" || formulaJsonObj.data.length  == 0)? "" : $.trim(formulaJsonObj.data[0].result);//公式
	var tableName  = fieldInfo.ownerTableName;
	formulaArgs.advanceUrl = advanceUrl+"&fieldType="+fieldType+"&formId="+formulaArgs.formId;
	formulaArgs.filterFields = fieldInfo.name;
	formulaArgs.allowSubFieldAloneUse = !isMasterField(fieldInfo);
	formulaArgs.checkSubFieldMethod = isMasterField(fieldInfo);
	formulaArgs.parentWin = window;
	formulaArgs.fieldTableName = tableName;
    formulaArgs.fieldType = fieldType;
    formulaArgs.selectedFieldName = fieldInfo.name;
	formulaArgs.selectedFieldDisplay = "{" + fieldInfo.display + "}";
	formulaArgs.data = data;
	formulaArgs.fieldInfo = fieldInfo;
	formulaArgs.advanceCheckRule = "0";
	formulaArgs.callBackCalledFunc = callback;
	formulaArgs.changetype = changetype;
	if(fieldType=="VARCHAR"){
		formulaArgs.needRelationFlowField = true;
	}
	return showFormula(formulaArgs);
}

//操作设置高级(已重构)
//cap4在用，标记一下，方便后面清理没用的方法
function setHighAuthDesign(param) {
	var oldFormulaStr = $(curtconditionValue).val();
	if (oldFormulaStr == $.i18n('form.authdesign.hightauth.label')) { //<点击设置条件>
		oldFormulaStr = "";
	}
	var formulaArgs = getConditionArgs(function(formulaStr) {
		if ($.trim(formulaStr) == "") {
			//<点击设置条件>
			formulaStr = $.i18n('form.authdesign.hightauth.label');
		}
		$(curtconditionValue).val(formulaStr);
	}, param.formId, _conditionType_hign_auth, oldFormulaStr, null,null);
	//条件设置
	formulaArgs.title = $.i18n('form.formquery.query.label');
	formulaArgs.allowSubFieldAloneUse = true;//6.0新增
	formulaArgs.checkSubFieldMethod = true;//验证重复项字段必须出现在重复项方法中。
	showFormula(formulaArgs);
}

//设置高级字段条件权限
//cap4在用，标记一下，方便后面清理没用的方法
function setHighFieldAuth(obj,filterField,isMasterField,fieldTableName,formId){
	var formulaArgs = getConditionArgs(function (formulaStr){
		if($.trim(formulaStr)==""){
			formulaStr= $.i18n("form.authdesign.hightauth.label");
		}
		$(obj).val(formulaStr);
	}, formId, _conditionType_hign_auth, $(obj).val(),null,null);
	formulaArgs.title = $.i18n('form.baseinfo.formula.condtion.set.label');
	//formulaArgs.filterFields =  filterField;
	formulaArgs.allowSubFieldAloneUse = true;
	formulaArgs.checkSubFieldMethod = isMasterField==true?true:false;;//验证重复项字段必须出现在重复项方法中。
	//isMasterField==true?false:true;//6.0修改
	formulaArgs.allowSubMethod = isMasterField==true?true:false;
	formulaArgs.fieldTableName = fieldTableName;
	showFormula(formulaArgs);
}

/**
 * 获取公式组件参数的公用方法
 * @param callBack 公式设置窗口设置的回调函数
 * @param formId 表单id
 * @param formulaType 公式类型
 * @param formulaStr 公式
 * @param formulaDes 公式描述
 * @since V7.0
 */
function getFormulaArgs(callBack,formId,formulaType,formulaStr,formulaDes){
	var obj={
		'callBack':callBack,//callback参数格式，第一个为计算式字符串，第二个为回调函数
		'formId':formId,
		'componentType':'componentType_formula',
		'formulaType':formulaType,
		'formulaStr':formulaStr,
		'formulaDes':formulaDes
	};
	return obj;
}

/**
 * 获取条件组件参数的公用方法
 * @param callBack 计算公式设置窗口确认之后的回调函数
 * @param formId 表单id
 * @param conditionType 条件类型
 * @param formulaStr 条件表达式
 * @param formulaDes 描述
 * @param queryOrReportId
 * @since V7.0
 */
function getConditionArgs(callBack,formId,conditionType,formulaStr,formulaDes,queryOrReportId){
	var obj={
		'callBack':callBack,//callback参数格式，第一个为计算式字符串，第二个为回调函数
		'formId':formId,
		'componentType':'componentType_condition',
		'conditionType':conditionType,
		'formulaStr':formulaStr,
		'formulaDes':formulaDes,
		'queryOrReportId':queryOrReportId
	};
	return obj;
}

/**
 * 打开公式条件设置对话框
 * @param formulaArgs 设计条件或者公式需要的参数
 *     固定属性
 * 			formId：需要获取的表单字段所在表单id，必填
 * 		    title：设置框的标题
 * 			componentType：组件类型--公式/条件
 * 			conditionType：需要设置的条件类型(有函数，无函数)
 * 			formulaType：需要设置的公式类型(数字，文本，日期类)
 * 			formulaStr：公式字符串
 * 			formulaDes：公式描述 原校验规则使用，先暂时没有用了
 * 			queryOrReportId：查询与统计的用户输入校验用
 * 			callBack：回调函数
 *     扩展属性
 *          panels：公式显示的页签，FormFormulaSetPanel实现类的key，目前由4种：formField--表单数据域，orgVar--组织机构变量，dateVar--日期变量，systemField--系统数据域
 *          qsType：目前仅有0/4，0表单数据查询，增加4流程非表单消息设置
 *          parentWin：父页面对象
 *
 * 		    fieldInfo：字段信息
 * 		    data：表单所有参数的JSON对象
 * 			callBackCalledFunc：回调函数调用的函数，目前主要是表单设计器中使用，设置校验规则和字段计算公式
 * 		    otherMagicId：魔方接口ID，默认为0
 * 		    operationType：魔方关系类型：trigger/relationform
 *
 * 	        changetype：
 * 			advanceUrl：高级功能的URL
 * 			filterFields：需要过滤掉的字段
 *
 * 			allowSubFieldAloneUse：是否需要校验重复项字段是否能单独使用
 * 		    allowSubFieldAloneUse4A：a表是否需要校验重复项字段是否能单独使用
 * 		    allowSubFieldAloneUse4B：b表是否需要校验重复项字段是否能单独使用
 * 		    allowSubMethod：字段高级权限,重复表字段进来不显示重复表的6个函数。
 * 		    checkSubFieldMethod：是否需要验证重复项字段必须出现在重复项方法中
 * 			hasDifferSubField：是否要校验表达式里是否包含2个不同重表的字段
 * 			fieldTableName：源字段的表当hasDifferSubField为true的时用作校验
 * 			subTableName：只留下的重复表表名
 *
 * 		    noCheck：是否不需要做校验
 * 			notAllowNull：是否允许空
 * 		    otherformId：其他表单ID
 * 		    operationType：
 * 		    tabindex：
 *
 * 		    subField：重复表关键字 自动更新设置计算公式时使用
 * 		    targetbillSet：自动更新单据间验证
 * 		    isAutoupdate：自动更新模块
 *
 * 		    isMaster：是否主表字段
 * 		    notNeedFunction：不需要的函数，参数为函数的Id
 * 		    fieldType：
 * 		    actionType：
 * 		    isMaster4Advanced：主表字段高级计算公式不需要显示重复表上一行
 *
 * 		    extendSubDep：
 * 		    fieldPrex：
 * 		    isNotOrgli：是否显示组织机构选项卡
 * 		    selectedFieldName：重复行相关函数用 选中的字段名称
 * 		    selectedFieldDisplay：重复行相关函数用 选中的字段显示名称
 * @since V7.0
 */
function showFormula(formulaArgs){
	var currentPath = window._ctxPath || top._ctxPath;
    //初始值
    var settings = {
        panels:'formField,orgVar,dateVar,systemField,constVar',
        qsType:'',
        parentWin:window,
    	formId:0,
        title:"",
        componentType:'',
        formulaType:'',
        conditionType:'',
        formulaStr:'',
        formulaDes:'',
        queryOrReportId:0,
        callBack:'',
        filterFields:'',
        notNeedFunction:'',
        otherMagicId:0,
		operationType:"trigger",

        fieldInfo:'',
        data: '',
		callBackCalledFunc: '',
        changetype:'',
        advanceUrl: '',
        allowSubFieldAloneUse:false,
        allowSubMethod:true,
        checkSubFieldMethod:false,
        hasDifferSubField:false,
        fieldTableName:'',
        subTableName:'',
        noCheck:false,
        notAllowNull:false,
        otherformId:0,
        tabindex:0,
        subField:'',
        targetbillSet:false,
        isAutoupdate:false,
        isMaster:false,
        fieldType:'',
        actionType:'',
        isMaster4Advanced:false,
        extendSubDep:false,
        fieldPrex:'',
        functionType:'',
        extParams:"",
		filter:{
        	tableName:'',
			inputType:'',
			fieldType:'',
			fieldName:''
		}
    };
    formulaArgs = $.extend(settings, formulaArgs);
    var formulaType = formulaArgs.conditionType ? formulaArgs.conditionType : formulaArgs.formulaType;
	var formulaAttr = formulaArgs.componentType + "::::::" + formulaType + "::::::" + formulaArgs.extParams;
	var title = formulaArgs.title || $.i18n('common.selectFormula.title');
	var formulaDialog = $.dialog({
		id: 'formula-setting-dlg',
		url: currentPath + "/cap4/formula.do?method=index&panels=" + formulaArgs.panels + "&formId=" + formulaArgs.formId + "&otherformId=" + formulaArgs.otherformId + (formulaArgs.qsType?"&qsType=" + formulaArgs.qsType:"") + "&formulaAttr=" + formulaAttr + "&magicRelationType=" + formulaArgs.operationType + "&otherMagicId=" + formulaArgs.otherMagicId + CsrfGuard.getUrlSurffix(),
		title : title,
		width:780,
		height:520,
		transParams:formulaArgs,
		targetWindow:getCtpTop(),
		buttons : [{
			text : $.i18n('common.button.ok.label'),
			id:"sure",
			isEmphasize: true,
			handler : function() {
                var result = formulaDialog.getReturnValue();
				if(result==true){
					formulaDialog.close();
				}
			}
		}, {
			text : $.i18n('common.button.cancel.label'),
			id:"exit",
			handler : function() {
				formulaDialog.close();
				if(typeof checkTemplateSubject === 'function'){
					checkTemplateSubject();
				}
				try{setText("");}
				catch(e){}
			}
		}]
	});
	return formulaDialog;
}

export {
    getConditionArgs,
    showFormula,
    setOrdinaryFieldFormula,
    getFormulaArgs,
    isMasterField }